/**
 * 
 */
package com.proyecto.histoclin.modelo.servicios;

import java.util.List;

import org.hibernate.exception.ConstraintViolationException;

import com.proyecto.core.modelo.excepciones.GeneralException;
import com.proyecto.core.modelo.servicio.ServicioGenerico;
import com.proyecto.histoclin.modelo.dto.CorrelativosHistoclinId;
import com.proyecto.histoclin.modelo.dto.HistoclinDiagnosticos;
import com.proyecto.histoclin.modelo.dto.HistoclinNotasevolucion;
import com.proyecto.histoclin.modelo.dto.HistoclinNotasevolucionDiagnostico;

/**
 * @author vico
 *
 */
public class ServicioHistoclinNotasevolucion extends ServicioGenerico {

	/**
	 * 
	 */
	ServicioCorrelativosHistoclin servicioCorrelativosHistoclin;
	ServicioHistoclinNotasevolucionDiagnostico servicioHistoclinNotasevolucionDiagnostico;
	ServicioHistoclinDiagnosticos servicioHistoclinDiagnosticos;
	
	public ServicioHistoclinNotasevolucion() {
		// TODO Auto-generated constructor stub
	}



	@Override
	public void incluir(Object pojo, boolean iniciaTransaccion) throws GeneralException {
		// TODO Auto-generated method stub
		
		HistoclinNotasevolucion objHistoclinNotasevoluciono = (HistoclinNotasevolucion)pojo;
		List<Object[]>  notevolucioncodMaxDx =null;
		if (isValidacionActiva()){
			validacion.incluir(objHistoclinNotasevoluciono);
		}
		
		
		try {
			
			String proxNumero = servicioCorrelativosHistoclin.obtenerProximoNumeroComoString(
					new CorrelativosHistoclinId (objHistoclinNotasevoluciono.getId().getCiaopr(), "HC_NTEVOLUCION","notevolucioncod" ) ,true);

			objHistoclinNotasevoluciono.getId().setNotevolucioncod(Integer.parseInt(proxNumero) );


			/*vamos a incluir los diagnosticos de evolucion pero debemos tener en cuenta:
			 * + Que... evolucion tras evolucion se va hacer un copiar-pegar pero de los diagnosticos de 
			 * histoclin_notasevolucion_diagnosticos
			 * 		Tener en cuenta fecha y hora max de la nota evolucion.
			 * + de no existir evolucion se tomaran los diasnosticos de histoclin_diagnosticos
			 * + los nuevos los incluiremos en histoclin_notasevolucion_diagnosticos
			 */
			try {
				notevolucioncodMaxDx = this.buscarMaxNotaEvolucionDx(
						objHistoclinNotasevoluciono.getId().getCiaopr(), 
						objHistoclinNotasevoluciono.getId().getHisclicod(), 
						objHistoclinNotasevoluciono.getNropersona());
				System.out.println("buscarMaxNotaEvolucionDx: " + notevolucioncodMaxDx.size() );
				
			} catch (Exception e) {
				// TODO: handle exception
				notevolucioncodMaxDx =null;
				System.err.println("buscarMaxNotaEvolucionDx: " + e.getMessage());
			}
			
			super.incluir(objHistoclinNotasevoluciono, iniciaTransaccion);
			
			if(notevolucioncodMaxDx == null){
				System.out.println("* no posee ningun dx en la nota de evolucion... toca desde los dx de ingreso ;) ");
				gestionarIncluirDxIngreso(
						objHistoclinNotasevoluciono.getId().getCiaopr(),
						objHistoclinNotasevoluciono.getId().getHisclicod(),
						objHistoclinNotasevoluciono.getNropersona(),
						objHistoclinNotasevoluciono.getId().getNotevolucioncod());
				
			}else{
				if(notevolucioncodMaxDx.size()==0){
					System.out.println("** no posee ningun dx en la nota de evolucion... toca desde los dx de ingreso ;) ");
					gestionarIncluirDxIngreso(
							objHistoclinNotasevoluciono.getId().getCiaopr(),
							objHistoclinNotasevoluciono.getId().getHisclicod(),
							objHistoclinNotasevoluciono.getNropersona(),
							objHistoclinNotasevoluciono.getId().getNotevolucioncod());
				}else{
					gestionarIncluirDxNotaEvolucion(
							objHistoclinNotasevoluciono.getId().getCiaopr(),
							objHistoclinNotasevoluciono.getId().getHisclicod(),
							objHistoclinNotasevoluciono.getNropersona(),
							objHistoclinNotasevoluciono.getId().getNotevolucioncod(),
							notevolucioncodMaxDx);
				}	
			}
			
		} catch (org.springframework.dao.DataIntegrityViolationException e) {
			
			if (e.getMostSpecificCause() instanceof org.hibernate.PropertyValueException) {
				throw new GeneralException(
						"advertencia." + claveProperties + ".incluir.datoRequeridoVacio");
			} else if (e.getMostSpecificCause() instanceof ConstraintViolationException) {
				throw new GeneralException(
						"advertencia." + claveProperties + ".incluir.registroDuplicado");
			}
			throw new GeneralException("error." + claveProperties + ".incluir");

		} catch (org.springframework.dao.DataAccessResourceFailureException e) {
			
			if (e.getMostSpecificCause() instanceof org.hibernate.exception.JDBCConnectionException) {
				throw new GeneralException(
						"error." + claveProperties + ".conexion");
			}
			throw new GeneralException("error." + claveProperties + ".incluir");
		} catch (Exception e) {
			System.err.println(":::ServicioHistoclinNotasevolucion::: " + e.getMessage());
			if("advertencia.HistoriasClinicas.datosEspecificos.HistoclinNotasevolucion.modificar.BloqueoOptimista".equals(e.getMessage())){
				throw new GeneralException(	e.getMessage());
			}else{
				throw new GeneralException(
						"error." + claveProperties + ".desconocido");
			}
		}
		
	}
	
	public List<Object[]> buscarMaxNotaEvolucionDx(String ciaopr, Integer hisclicod, Integer nropersona){
		Integer notevolucioncodMax = null;
		String fchevolcod=null,horaevolcod=null;
		List<Object[]> resultados2 = null;
		String query = "";
		String query1 = "SELECT max(fchevolcod) AS fchevolcod, max(horaevolcod) AS horaevolcod " +
						"FROM HistoclinNotasevolucion AS HCNE " +
						"WHERE HCNE.id.ciaopr = '" + ciaopr + "'" +
							" AND HCNE.id.hisclicod = " + hisclicod +
							" AND HCNE.nropersona = " + nropersona;
		

		try{
			System.out.println("buscarMaxNotaEvolucion.query1: " + query1);
			List<Object[]> resultados = propiedadDAO.ejecutarQueryConsulta(query1, null);
			Object[]  arreglo = (Object[])resultados.get(0);
			System.out.println("resultados.size(): " + resultados.size());
			
			fchevolcod = arreglo[0].toString();
			horaevolcod = arreglo[1].toString();

		}catch(Exception e){
			fchevolcod = null;
			horaevolcod = null;
			System.err.println("e.query1: " + e.getMessage());
		}
		
		if(fchevolcod == null || horaevolcod == null){
			
		}else{
			query = "SELECT C.id.notevolucioncod, C.ciecod " +
			"FROM HistoclinNotasevolucion AS A, " +
			"HistoclinNotasevolucionDiagnostico AS C " +
			"WHERE A.id.hisclicod = " + hisclicod +
				" AND A.nropersona = " + nropersona +
				" AND A.fchevolcod = '" + fchevolcod + "'" +
				" AND A.horaevolcod = '" + horaevolcod + "'" +
				" AND A.id.hisclicod = C.id.hisclicod" +
				" AND A.nropersona = C.nropersona " +
				" AND A.id.notevolucioncod = C.id.notevolucioncod "
			;

			System.out.println("buscarMaxNotaEvolucion.query: " + query);
		
			try{
			resultados2 = propiedadDAO.ejecutarQueryConsulta(query,null);
			//= (Object[])resultados2.get(0);
			
			//notevolucioncodMax = Integer.parseInt( arreglo2[0].toString() );
			//notevolucioncodMax = (Integer) resultados.get(0);
			/*
			 * Object[] arreglo2 ;
			HistoclinNotasevolucionDiagnostico objHistoclinNotasevolucionDiagnostico = null;//new HistoclinNotasevolucionDiagnostico();
			for(int i=0 ; i<resultados2.size(); i++){
				arreglo2 = (Object[])resultados2.get(i);
				for(int j=0 ; j<arreglo2.length ; j++){
					System.out.println(arreglo2[j].toString());
				}
			}
			
			*/
			}catch(Exception e){
				resultados2 = null;
				System.out.println("e.query: " + query);
			}
		}
		
		return resultados2;	
			
	}
	
	public void gestionarIncluirDxIngreso(String ciaopr, Integer hisclicod, Integer nropersona, Integer notevolucioncod){
		List<HistoclinDiagnosticos> lstHistoclinDiagnosticos = 
			servicioHistoclinDiagnosticos.buscarListaDiagnostico(
					ciaopr, hisclicod, nropersona);
		if(lstHistoclinDiagnosticos==null){
			System.out.println("no posee dx de ingreso :( ");
		}else{
			HistoclinNotasevolucionDiagnostico objHistoclinNotasevolucionDiagnostico = null;
			for(int i =0 ; i<lstHistoclinDiagnosticos.size();i++){
				objHistoclinNotasevolucionDiagnostico = new HistoclinNotasevolucionDiagnostico();
				objHistoclinNotasevolucionDiagnostico.getId().setCiaopr(ciaopr);
				objHistoclinNotasevolucionDiagnostico.getId().setHisclicod(hisclicod);
				objHistoclinNotasevolucionDiagnostico.setNropersona(nropersona);
				objHistoclinNotasevolucionDiagnostico.getId().setNotevolucioncod(notevolucioncod);
				objHistoclinNotasevolucionDiagnostico.setDiagprin(lstHistoclinDiagnosticos.get(i).getDiagprin());
				objHistoclinNotasevolucionDiagnostico.setCiecod(lstHistoclinDiagnosticos.get(i).getCiecod());
				try {
					servicioHistoclinNotasevolucionDiagnostico.incluir(objHistoclinNotasevolucionDiagnostico, true);
				} catch (Exception e) {
					// TODO: handle exception
					System.err.println("servicioHistoclinNotasevolucionDiagnostico.gestionarIncluirDxIngreso.incluir: " + e.getMessage());
				}
			}
		}
	}
	
	public void gestionarIncluirDxNotaEvolucion(String ciaopr, Integer hisclicod, Integer nropersona, Integer notevolucioncod, List<Object[]>  notevolucioncodMaxDx){
		
		HistoclinNotasevolucionDiagnostico objHistoclinNotasevolucionDiagnostico = null;
		Object[] arregloDx;
		for(int i=0 ; i<notevolucioncodMaxDx.size(); i++){
			arregloDx = (Object[])notevolucioncodMaxDx.get(i);
			objHistoclinNotasevolucionDiagnostico = new HistoclinNotasevolucionDiagnostico();
			for(int j=1 ; j<arregloDx.length ; j++){
				System.out.println(arregloDx[j].toString());
				objHistoclinNotasevolucionDiagnostico.getId().setCiaopr(ciaopr);
				objHistoclinNotasevolucionDiagnostico.getId().setHisclicod(hisclicod);
				objHistoclinNotasevolucionDiagnostico.setNropersona(nropersona);
				objHistoclinNotasevolucionDiagnostico.getId().setNotevolucioncod(notevolucioncod);
				objHistoclinNotasevolucionDiagnostico.setDiagprin("N");
				objHistoclinNotasevolucionDiagnostico.setCiecod(arregloDx[j].toString());
				try {
					servicioHistoclinNotasevolucionDiagnostico.incluir(objHistoclinNotasevolucionDiagnostico, true);
				} catch (Exception e) {
					// TODO: handle exception
					System.err.println("servicioHistoclinNotasevolucionDiagnostico.incluir: " + e.getMessage());
				}
				
			}
		}

	}
	
	public ServicioCorrelativosHistoclin getServicioCorrelativosHistoclin() {
		return servicioCorrelativosHistoclin;
	}

	public void setServicioCorrelativosHistoclin(
			ServicioCorrelativosHistoclin servicioCorrelativosHistoclin) {
		this.servicioCorrelativosHistoclin = servicioCorrelativosHistoclin;
	}



	public ServicioHistoclinNotasevolucionDiagnostico getServicioHistoclinNotasevolucionDiagnostico() {
		return servicioHistoclinNotasevolucionDiagnostico;
	}



	public void setServicioHistoclinNotasevolucionDiagnostico(
			ServicioHistoclinNotasevolucionDiagnostico servicioHistoclinNotasevolucionDiagnostico) {
		this.servicioHistoclinNotasevolucionDiagnostico = servicioHistoclinNotasevolucionDiagnostico;
	}



	public ServicioHistoclinDiagnosticos getServicioHistoclinDiagnosticos() {
		return servicioHistoclinDiagnosticos;
	}



	public void setServicioHistoclinDiagnosticos(
			ServicioHistoclinDiagnosticos servicioHistoclinDiagnosticos) {
		this.servicioHistoclinDiagnosticos = servicioHistoclinDiagnosticos;
	}

}
